type Record<K extends keyof any, T> = {
  [P in K]: T;
};

// Record：了解它先理解其他三个
// K extends keyof T 理解 【泛型约束条件，常见是有一个接口类型，然后传入的联合类型必须是他的子类型或者跟他一样的联合类型】
// K extends keyof any 【keyof any => string | number | symbol, 意思就是可以穿入任何这三种类型]
// P in K 是一个迭代器的使用，遍历一个值类型的联合类型

// Record经常使用场景，可以用在生成一个string | number | symbol的一个索引类型,第二哥泛型参数是索引变量的类型
type StringIndex = Record<string, number> 
// type StringIndex = {
//   [x: string]: number;
// }
let test: StringIndex = {11: 9} // 可以这样子是因为数字11的值可以被转成字符串

type NumberIndex = Record<number, string>
let test1: NumberIndex = {'33': '99'} // 这也是同理，值‘33’会被转成数字
let test2: NumberIndex = {'U33': '99'} 
// 能将类型“{ U33: string; }”分配给类型“NumberIndex”。
// 对象文字可以只指定已知属性，并且“'U33'”不在类型“NumberIndex”中


// 使用场景二，用在把一个接口类型的所有属性类型全部修改为某一个类型
interface People  {
  name: string;
  age: number;
  phone: number;
  nation: string
}
// 把接口类型perple的所有属性全部变成string类型
type PeopleRecord = Record<keyof People, string>
// type PeopleRecord = {
//   name: string;
//   age: string;
//   phone: string;
//   nation: string;
// }
export {}